/*
 * worker.c
 *
 *  Created on: May 6, 2009
 *      Author: marco
 */

#include <stdio.h>  /* serve per la perror */
#include <stdlib.h> /* serve per la exit   */
#include <string.h> /* serve per strlen    */
#include <errno.h>  /* serve per errno     */
#include <unistd.h> /* serve per la write  */
#include <ctype.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

#define FILES 4; // ?

/*
 * per quanto riguarda la o_pipe..
 * 		-o si crea qui quando è autenticato e si crea in nmats per comunicare fallimento
 * 		-o si crea comunque in nmats
 */
void run();

char **matrices;
char buffer[121];
char *cmdline = NULL; // non serve?
char **args;
int mnum = 0;
int allocated = 10; //nome migliore?
int arg_num = 5; //macro?

//sopratutto.. modo migliore di passare parametri che per argomenti così?
int main(int argc, char **argv) { //serve argc?
	int pid = getpid();
	int in;
	int out;
	char *i_pipe;
	char *o_pipe;
	//char *buffer;
	i_pipe = malloc(30 * sizeof(char));
	o_pipe = malloc(30 * sizeof(char));
	DIR *wdir;
	struct dirent *file;

	printf("Worker %d per l'utente %s:%s\n",pid,argv[1],argv[2]);
	sprintf(i_pipe,"%s%s","../clientserver",argv[2]); //giusto dare cosi la dir?
	mkfifo(i_pipe, 0644); //magari farle fare tutte in /tmp
	in = open(i_pipe, O_RDONLY); // riguardarsi i nonblock
	printf("creata la pipe %s\n",i_pipe);
	sprintf(o_pipe,"%s%s","../serverclient",argv[2]);
	out = open(o_pipe, O_WRONLY);
	//magari farle fare tutte in /tmp
	printf("Worker: pipe pronte\n");

//	if (chdir(argv[1]) == -1) { //farne na macruccia?
//		perror("chdir");
//		exit(errno);
//	}
	char *temp;
	char *aux;
	char *aux2;
	temp = malloc(80 * sizeof(char));
	aux = malloc(80 * sizeof(char));
	aux = getwd(aux); // e questo uorning? //dice dangerous..
	aux2 = malloc(80 * sizeof(char));
	aux2 = getwd(aux2);
	sprintf(temp,"%s/%s",".",argv[1]);
	printf("temp = !%s! \n", temp);

	if ((wdir = opendir (temp)) == NULL ) {
		perror("errore opendir");
		exit(errno);
	}
	chdir(temp);
	getcwd(aux2, 30);
	printf("getcwd 2 %s\n", aux2);

	matrices = malloc(allocated * sizeof(char*));

	//problema.. cosi quelle create dopo saltan ol'ordine?
	int n = 0;
	while((file=readdir(wdir))) { // ma cosi mette anche . e ..

		if (mnum == allocated) {
			allocated *= 2;
			matrices = realloc(matrices, allocated * sizeof(char*)); //non va
		}
		// per if(S_ISREG(file->d_type)) rivedere.. da usare stat..
		if(file->d_type == DT_REG){ //if(file->d_type == 8)
			printf("if dtype= %d\n",file->d_type);
			matrices[n] = file->d_name; // o strdup ??
			printf("%s\n",matrices[n]);
			n++;
		}


	 }// fine scansione dir

	printf("trovate %d matrici\n", n);
	 //controllare la directory
	printf("dir worker %s \n",get_current_dir_name());

	// fine controllo dir

	//invio al client info sulle matrici

	//fine invio

	sleep(2);

	printf("inizio lettura da pipe per comando\n");
//	while(!feof(in) && !ferror(in) && fgets(buffer, sizeof(buffer),in)) {
//		printf("!&s!", buffer);
//	}
	int rd;
	int agv = 0;
	int type;
	int args_num;
	//inizio receive da sistemare

	read(in,&args_num,sizeof(int));
	read(in,&type,sizeof(int));
	args = malloc (arg_num * sizeof(char*));

	printf("args num=%d , type=%d\n",args_num,type);
	while ((rd = read(in,&buffer, 50)) > 0) { // ma perchè sia buffer che &buffer vanno uguale?
		printf("!%s!\n", buffer);
		if ( agv == arg_num) {
			arg_num *= 2;
			args = (char**)realloc(args, arg_num * sizeof(char**));
			printf("reallocato args\n");
		}
		args[agv] = strdup(buffer);

		agv++;
	}

	//fine receive da sistemare


	int i;
	for(i = 0; i<agv; i++ ){
		printf("arg[%d]=%s\n",i,args[i]);
	}
	printf("rd=%d\n",rd);

	perror("read pipe");

	printf("fine lettura\n");

	printf("worker per %s in chiusura..\n", argv[1]);

	//close(i_pipe); //vedere lo warn
	//close(o_pipe);
	unlink(i_pipe);
	return 0;
}
